package cn.siriusbot.siriuspro.bot.plugin.factory;

import java.lang.annotation.Annotation;
import java.util.List;

/**
 * 应用的工厂
 */
public interface SiriusAppFactory {

    /**
     * 扫描@SiriusComponent注解
     *
     * @param clazz 被扫描的类
     */
    void scanComponent(Class<?> clazz);

    /**
     * 初始化所有的组件
     */
    void startComponent();

    /**
     * 初始化所有的组件
     * @param loadDependence 是否自动加载依赖
     */
    void startComponent(boolean loadDependence);

    /**
     * 通过类型获取组件
     *
     * @param clazz 类型
     * @return 组件对象
     */
    <T> T getComponent(Class<T> clazz);

    /**
     * 通过注解类型获取组件
     *
     * @param clazz 类型
     * @return 组件对象
     */
    <T extends Annotation> List<Object> getComponentByAnnotation(Class<T> clazz);

    /**
     * 通过名字获取组件
     *
     * @param name 名字
     * @return 组件对象
     */
    Object getComponent(String name);

    /**
     * 通过注解获取方法列表
     *
     * @param annotation 注解对象
     * @param <T>        注解对象类
     * @return 方法对象列表
     */
    <T extends Annotation> List<SiriusMethod<T>> getSiriusMethod(Class<T> annotation);

    /**
     * 添加Bean对象
     *
     * @param name 名称
     * @param o    对象
     */
    void addBean(String name, Object o);
}
